const Service = require('egg').Service
const ExcelJS = require('exceljs')
const { filterData } = require('../utils/filter')

class SupplierService extends Service {
  /**
   * 获取所有供应商代码和名称
   * @return {Promise} 供应商代码和名称列表
   */
  async getSupplierInfoByBody(body) {
    const { ctx } = this
    try {
      const suppliers = await this.app.mysql.query('select * from supplier_info where supplier_name like ? and address like ?', [
        '%' + body.vendorName + '%',
        '%' + body.vendorAddress + '%'
      ])
      return suppliers
    } catch (error) {
      ctx.logger.error('获取供应商列表失败:', error)
      throw new Error('获取供应商列表失败')
    }
  }

  async exportExcel(body) {
    const { ctx } = this
    try {
      // 写入文件
      const workbook = new ExcelJS.Workbook()
      const sheet = workbook.addWorksheet('THÔNG TIN NCC ', {
        views: [{ state: 'frozen', xSplit: 5, ySplit: 2 }], // 冻结前两行（标题+表头）
        properties: { defaultRowHeight: 20 }
      })
      const templateColumnWidths = [
        8.5, // A
        15.75, // B
        50.44, // C
        15.75, // D
        15.75, // E
        60.31, // F
        26.56, // G
        50.31, // H
        25.25, // I
        18.5, // J
        22.19, // K
        33.56, // L
        14.56, // M
        20.0, // N (补充)
        20.0, // O (补充)
        20.0, // P (补充)
        20.0, // Q (补充)
        14.56, // R (对应模板中的 S / R 混淆位置)
        14.56 // S
      ]
      // 构建列定义（包含 header、key、width）
      const columns = (body.tableHeader || []).map((item, idx) => {
        const width = templateColumnWidths[idx] || 20
        return {
          header: item.label,
          key: item.prop,
          width
        }
      })
      sheet.columns = columns

      // --- Title（仿模板：占整行，较大字体） ---
      // 合并第一行 A1 到 当前最后一列（比如 A1:T1）
      // const lastColumnLetter = sheet.getColumn(sheet.columns.length || 1).letter || 'T'
      // const titleRange = `A1:${lastColumnLetter}1`
      // sheet.mergeCells(titleRange)
      const row = sheet.getRow(1)
      columns.forEach((item, index) => {
        console.log(index)
        row.values.push(index + 1)
      })
      console.log(row.values)

      // titleCell.font = { name: 'Calibri', size: 12, bold: true }
      // titleCell.alignment = { horizontal: 'center', vertical: 'middle', wrapText: true }
      // sheet.getRow(1).height = 18 // 模板里标题行高度的近似值

      // --- Header 行（第二行）样式（表头） ---
      const headerRow = sheet.getRow(2)
      headerRow.height = 30 // 与模板匹配的表头行高（近似）
      headerRow.values = sheet.columns.map((col) => col.header)

      headerRow.eachCell((cell) => {
        // 表头填充（浅灰 / 模板接近无色，但这里用浅灰以保证可见）
        cell.fill = {
          type: 'pattern',
          pattern: 'solid',
          fgColor: { argb: '2F75B5' } // 浅灰
        }
        cell.font = {
          name: 'Calibri',
          size: 14, // 模板表头约 14~17，选 14 保证兼容
          bold: true,
          color: { argb: 'FFFFFF' }
        }
        cell.alignment = {
          horizontal: 'center',
          vertical: 'middle',
          wrapText: true
        }
        cell.border = {
          top: { style: 'thin' },
          left: { style: 'thin' },
          bottom: { style: 'thin' },
          right: { style: 'thin' }
        }
      })

      const data = (await this.getSupplierInfoByBody(body)) || []

      // 将数据对象映射为与 columns 顺序一致的数组（避免 ExcelJS 对对象键的不一致）
      const mappedRows = data.map((rowObj) => {
        return sheet.columns.map((col) => {
          // 处理日期类型：若是 Date-like 字符串或 Date 对象，ExcelJS 会自动尝试处理
          const val = rowObj[col.key]
          return val === undefined || val === null ? '' : val
        })
      })
      // 写入行，从第三行开始（因为我们使用了 A1 标题、A2 表头）
      // addRows 会自动从当前最后一行后追加
      if (mappedRows.length > 0) {
        sheet.addRows(mappedRows)
      }
      // --- 正文样式（从第3行到最后一行） ---
      // 默认字体与对齐、边框、行高（复刻模板：正文行高约 58.5，但为了兼容我们设置为 22-28）
      const firstDataRowNumber = 3
      for (let i = firstDataRowNumber; i <= sheet.rowCount; i++) {
        const row = sheet.getRow(i)
        row.height = 35 // 由于模板在不同单元格高度上有不同显示，我们取一个合理值（可调）

        row.eachCell((cell) => {
          cell.font = {
            name: 'Calibri',
            size: 11
          }
          cell.alignment = {
            horizontal: 'left',
            vertical: 'middle',
            wrapText: true
          }
          cell.border = {
            top: { style: 'thin' },
            left: { style: 'thin' },
            bottom: { style: 'thin' },
            right: { style: 'thin' }
          }
        })

        // 第一列（序号或编号）居中显示
        const firstCell = row.getCell(1)
        if (firstCell) {
          firstCell.alignment = {
            horizontal: 'center',
            vertical: 'middle'
          }
        }
      }
      // --- 自动检测“状态”列并应用状态高亮（值为 '合作' 时） ---
      // 支持常见的表头关键字：status, trạng, trang, 状态, hợp tác, 合作
      const statusHeaderIndex = sheet.columns.findIndex((c) => {
        const headerText = String(c.header || '').toLowerCase()
        const keyText = String(c.key || '').toLowerCase()
        return (
          /status|trạng|trang|状态|hợp|hop tac|hop|合作|合作中/.test(headerText) || /status|trạng|trang|状态|hợp|hop tac|hop|hezuo|合作/.test(keyText)
        )
      })
      if (statusHeaderIndex >= 0) {
        const statusColNumber = statusHeaderIndex + 1 // columns index -> excel colNumber
        for (let r = firstDataRowNumber; r <= sheet.rowCount; r++) {
          const statusCell = sheet.getRow(r).getCell(statusColNumber)
          const statusVal = statusCell && statusCell.value ? String(statusCell.value).trim() : ''
          if (
            statusVal === '合作' ||
            statusVal.toLowerCase() === 'hợp tác' ||
            statusVal.toLowerCase() === 'cooperation' ||
            statusVal.toLowerCase() === 'cooperating'
          ) {
            statusCell.fill = {
              type: 'pattern',
              pattern: 'solid',
              fgColor: { argb: 'FF90EE90' } // 浅绿，高亮
            }
          }
        }
      }

      // // --- 打印 / 页面设置（A4 横向） ---
      // sheet.pageSetup = {
      //   paperSize: 9, // A4
      //   orientation: 'landscape',
      //   horizontalCentered: false,
      //   verticalCentered: false,
      //   margins: { left: 0.4, right: 0.4, top: 0.5, bottom: 0.5, header: 0.3, footer: 0.3 },
      //   printArea: `A1:${lastColumnLetter}${sheet.rowCount}`
      // }
      // // 重复表头行（第2行）在每页上
      // sheet.pageSetup.printTitlesRow = '2:2'

      // // --- 页眉 / 页脚（可按需调整） ---
      // sheet.headerFooter = {
      //   differentFirst: false,
      //   oddHeader: `&C&"Calibri,Bold"&14 THÔNG TIN NCC`, // 居中页眉
      //   oddFooter: `&L导出时间: ${new Date().toLocaleString()} &R第 &P 页 / 共 &N 页`
      // }

      const buffer = await workbook.xlsx.writeBuffer()
      return buffer
    } catch (error) {
      ctx.logger.error('Error', error)
      throw new Error('Error')
    }
  }

  /**
   * 批量更新或创建供应商信息
   * @param {Array} supplierArray - 供应商数据数组
   * @returns {Object} 操作结果
   */
  async saveSupplierInfoByBody(supplierArray) {
    const { ctx } = this
    if (!Array.isArray(supplierArray) || supplierArray.length === 0) {
      throw new Error('传入的数据必须是非空数组')
    }
    try {
      supplierArray.forEach(async (item) => {
        if (item.id) {
          const filteredData = filterData(item)
          await this.app.mysql.update('supplier_info', filteredData)
        } else {
          const filteredData = filterData(item)
          await this.app.mysql.insert('supplier_info', filteredData)
        }
      })

      return 'OK'
    } catch (error) {
      ctx.logger.error('保存失败:', error)
      throw new Error('保存失败')
    }
  }

  async deleteSupplierInfoByBody(supplierArray) {
    const { ctx } = this
    if (!Array.isArray(supplierArray) || supplierArray.length === 0) {
      throw new Error('传入的数据必须是非空数组')
    }
    try {
      supplierArray.forEach(async (item) => {
        if (item.id) {
          const filteredData = filterData(item)
          await this.app.mysql.delete('supplier_info', filteredData)
        } else {
          throw new Error('111')
        }
      })
      return 'OK'
    } catch (error) {
      ctx.logger.error('删除失败:', error)
      throw new Error('删除失败')
    }
  }
}

module.exports = SupplierService
